<?php

namespace app\common\library;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Handler\CurlHandler;
use GuzzleHttp\HandlerStack;
use think\facade\Log;

class GuzzleTool
{
    /**
     * 发送 POST 请求
     * @param string $log_name 日志通道名称
     * @param string $url 请求地址
     * @param string $body 请求体
     * @param array $headers 请求头
     * @return string 返回结果
     */
    public static function postraw($log_name = 'my', $url = '', $body = '', $headers = [])
    {
        // 默认请求头
        if (empty($headers)) {
            $headers = [
                'Content-Type' => 'application/json',
            ];
        }

        // 记录请求日志
        Log::channel($log_name)->info("[url] $url" . PHP_EOL . "[body] $body" . PHP_EOL . "[headers] " . json_encode($headers));

        try {
            // 强制使用标准 CurlHandler
            $handlerStack = HandlerStack::create(new CurlHandler());

            // 初始化 Guzzle 客户端
            $client = new Client([
                'handler' => $handlerStack, // 设置自定义处理器
                'timeout' => 10,           // 设置超时时间
                'http_errors' => false,    // 防止请求失败直接抛出异常
            ]);

            // 发送同步请求
            $response = $client->request('POST', $url, [
                'headers' => $headers,
                'body' => $body,
            ]);

            // 获取响应内容
            $result = (string)$response->getBody();

            // 记录响应日志
            Log::channel($log_name)->info("[result] $result");

            return $result;
        } catch (RequestException $e) {
            // 捕获异常并记录错误日志
            Log::channel($log_name)->error("[error] {$e->getMessage()}" . PHP_EOL . "[trace] {$e->getTraceAsString()}");
            return '';
        }
    }
}
